home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / lha_axeman / lharc.h < prev    next >
C/C++ Source or Header  |  1995-09-01  |  10KB  |  374 lines

  1. /*----------------------------------------------------------------------*/
  2. /*        LHarc Archiver Driver for UNIX                */
  3. /*                                    */
  4. /*        Copyright(C) MCMLXXXIX  Yooichi.Tagawa            */
  5. /*                                    */
  6. /*  V1.00  Fixed                1989.09.22  Y.Tagawa    */
  7. /*  V0.03  LHa for UNIX                1991.12.18  M.Oki    */
  8. /*----------------------------------------------------------------------*/
  9.  
  10. #include <stdio.h>
  11. #include <ctype.h>
  12. #include <sys/types.h>
  13. //#include <sys/file.h>
  14. #include <sys/stat.h>
  15.  
  16. #include <signal.h>
  17.  
  18. /* most of System V,  define SYSTIME_HAS_NO_TM */
  19. #include <time.h>
  20.  
  21. /*----------------------------------------------------------------------*/
  22. /*            DIRECTORY ACCESS STUFF                */
  23. /*----------------------------------------------------------------------*/
  24. #ifndef NODIRECTORY
  25.  
  26. #include <dirent.h>
  27. #define DIRENTRY    struct dirent
  28. #define NAMLEN(p)    strlen (p->d_name)
  29.  
  30. #endif
  31.  
  32. /*----------------------------------------------------------------------*/
  33. /*                FILE ATTRIBUTES                */
  34. /*----------------------------------------------------------------------*/
  35.  
  36. /* If file mode is not compatible between your Machine/OS and
  37.    LHarc standard UNIX file mode.
  38.    (See UNIX Manual stat(1), <sys/stat.h>,
  39.    and/or below UNIX_* definitions. ) */
  40. /* #define NOT_COMPATIBLE_MODE */
  41. #define is_directory(statp)    (((statp)->st_mode & S_IFMT) == S_IFDIR)
  42. #define is_regularfile(statp)    (((statp)->st_mode & S_IFMT) == S_IFREG)
  43.  
  44. /* #define WRITE_BINARY    "wb" */
  45. /* #define READ_BINARy    "rb" */
  46. #define WRITE_BINARY    "w"
  47. #define READ_BINARY    "r"
  48.  
  49. /*----------------------------------------------------------------------*/
  50. /*            MEMORY AND STRING FUNCTIONS            */
  51. /*----------------------------------------------------------------------*/
  52.  
  53. #ifndef USG
  54. #include <strings.h>
  55. #else
  56. #include <string.h>
  57. #endif    /* USG */
  58.  
  59. #ifdef NOINDEX
  60. #define index strchr
  61. #define rindex strrchr
  62. #endif    /* NOINDEX */
  63.  
  64. #ifdef NOBSTRING
  65. #define bcmp(a,b,n) memcmp ((a),(b),(n))
  66. #define bzero(d,n) memset((d),0,(n))
  67. #define bcopy(s,d,n) memmove((d),(s),(n))
  68. #endif    /* NOBSTRING */
  69.  
  70. #ifdef USESTRCASECMP
  71. #define strucmp(p,q) strcasecmp((p),(q))
  72. #endif
  73.  
  74. /*----------------------------------------------------------------------*/
  75. /*                YOUR CUSTOMIZIES            */
  76. /*----------------------------------------------------------------------*/
  77. /* These definitions are changable to you like.             */
  78. /* #define ARCHIVENAME_EXTENTION        ".LZH"            */
  79. /* #define BACKUPNAME_EXTENTION            ".BAK"            */
  80. /* #define TMP_FILENAME_TEMPLATE        "/usr/tmp/lhXXXXXX"    */
  81. /* #define MULTIBYTE_CHAR                        */
  82. /* #define USE_PROF                            */
  83.  
  84. #ifndef ARCHIVENAME_EXTENTION
  85. #define ARCHIVENAME_EXTENTION    ".lzh"
  86. #endif
  87. #ifndef BACKUPNAME_EXTENTION
  88. #define BACKUPNAME_EXTENTION    ".bak"
  89. #endif
  90. #ifndef TMP_FILENAME_TEMPLATE
  91. #define TMP_FILENAME_TEMPLATE    "/tmp/lhXXXXXX"
  92. #endif
  93.  
  94. #define SJC_FIRST_P(c)            \
  95.   (((unsigned char)(c) >= 0x80) &&    \
  96.    (((unsigned char)(c) < 0xa0) ||    \
  97.     ((unsigned char)(c) >= 0xe0) &&    \
  98.     ((unsigned char)(c) < 0xfd)))
  99. #define SJC_SECOND_P(c)            \
  100.   (((unsigned char)(c) >= 0x40) &&    \
  101.    ((unsigned char)(c) < 0xfd) &&    \
  102.    ((ungigned char)(c) != 0x7f))
  103.  
  104. #ifdef MULTIBYTE_CHAR
  105. #define MULTIBYTE_FIRST_P    SJC_FIRST_P
  106. #define MULTIBYTE_SECOND_P    SJC_SECOND_P
  107. #endif /* MULTIBYTE_CHAR */
  108.  
  109. /*----------------------------------------------------------------------*/
  110. /*            OTHER DIFINITIONS                */
  111. /*----------------------------------------------------------------------*/
  112.  
  113. /* Your C-Compiler has no 'void' */
  114. #ifdef NO_VOID
  115. #define void
  116. #endif
  117.  
  118. #ifndef SEEK_SET
  119. #define SEEK_SET    0
  120. #define SEEK_CUR    1
  121. #define SEEK_END    2
  122. #endif
  123.  
  124. #define FILENAME_LENGTH    1024
  125.  
  126.  
  127. /* non-integral functions */
  128. extern struct tm *localtime ();
  129. extern char *getenv ();
  130.  
  131. #ifndef _MINIX
  132. #ifndef __STDC__
  133. extern char *malloc ();
  134. extern char *realloc ();
  135. #endif
  136. #endif
  137.  
  138. /* external variables */
  139. extern int errno;
  140.  
  141.  
  142. #define    FALSE    0
  143. #define TRUE    1
  144. typedef int boolean;
  145.  
  146.  
  147. /*----------------------------------------------------------------------*/
  148. /*            LHarc FILE DEFINITIONS                */
  149. /*----------------------------------------------------------------------*/
  150. #define METHOD_TYPE_STRAGE    5
  151. #define LZHUFF0_METHOD        "-lh0-"
  152. #define LZHUFF1_METHOD        "-lh1-"
  153. #define LZHUFF2_METHOD        "-lh2-"
  154. #define LZHUFF3_METHOD        "-lh3-"
  155. #define LZHUFF4_METHOD        "-lh4-"
  156. #define LZHUFF5_METHOD        "-lh5-"
  157. #define LARC4_METHOD        "-lz4-"
  158. #define LARC5_METHOD        "-lz5-"
  159. #define LZHDIRS_METHOD        "-lhd-"
  160.  
  161. #define I_HEADER_SIZE            0
  162. #define I_HEADER_CHECKSUM        1
  163. #define I_METHOD            2
  164. #define I_PACKED_SIZE            7
  165. #define I_ORIGINAL_SIZE            11
  166. #define I_LAST_MODIFIED_STAMP        15
  167. #define I_ATTRIBUTE            19
  168. #define I_HEADER_LEVEL            20
  169. #define I_NAME_LENGTH            21
  170. #define I_NAME                22
  171.  
  172. #define I_CRC                22 /* + name_length */
  173. #define I_EXTEND_TYPE            24 /* + name_length */
  174. #define I_MINOR_VERSION            25 /* + name_length */
  175. #define I_UNIX_LAST_MODIFIED_STAMP    26 /* + name_length */
  176. #define I_UNIX_MODE            30 /* + name_length */
  177. #define I_UNIX_UID            32 /* + name_length */
  178. #define I_UNIX_GID            34 /* + name_length */
  179. #define I_UNIX_EXTEND_BOTTOM        36 /* + name_length */
  180.  
  181. #define I_GENERIC_HEADER_BOTTOM        I_EXTEND_TYPE
  182.  
  183.  
  184.  
  185. #define EXTEND_GENERIC        0
  186. #define EXTEND_UNIX        'U'
  187. #define EXTEND_MSDOS        'M'
  188. #define EXTEND_MACOS        'm'
  189. #define EXTEND_OS9        '9'
  190. #define EXTEND_OS2        '2'
  191. #define EXTEND_OS68K        'K'
  192. #define EXTEND_OS386        '3'        /* OS-9000??? */
  193. #define EXTEND_HUMAN        'H'
  194. #define EXTEND_CPM        'C'
  195. #define EXTEND_FLEX        'F'
  196. #define EXTEND_RUNSER        'R'
  197. /*    this OS type is not official */
  198. #define EXTEND_TOWNSOS        'T'
  199. #define EXTEND_XOSK        'X'
  200. /*------------------------------*/
  201.  
  202. #define GENERIC_ATTRIBUTE            0x20
  203. #define GENERIC_DIRECTORY_ATTRIBUTE        0x10
  204. #define HEADER_LEVEL0                0x00
  205. #define HEADER_LEVEL1                0x01
  206. #define HEADER_LEVEL2                0x02
  207.  
  208. #define CURRENT_UNIX_MINOR_VERSION        0x00
  209.  
  210. #define DELIM ('/')
  211. #define DELIM2 (0xff)
  212. #define DELIMSTR "/"
  213.  
  214.  
  215. typedef struct LzHeader {
  216.   unsigned char        header_size;
  217.   char            method[METHOD_TYPE_STRAGE];
  218.   long            packed_size;
  219.   long            original_size;
  220.   long            last_modified_stamp;
  221.   unsigned char    attribute;
  222.   unsigned char header_level;
  223.   char            name[256];
  224.   unsigned short    crc;
  225.   boolean        has_crc;
  226.   unsigned char        extend_type;
  227.   unsigned char        minor_version;
  228.   /*  extend_type == EXTEND_UNIX  and convert from other type. */
  229.   time_t        unix_last_modified_stamp;
  230.   unsigned short    unix_mode;
  231.   unsigned short    unix_uid;
  232.   unsigned short    unix_gid;
  233. } LzHeader;
  234.  
  235. #define OSK_RW_RW_RW            0000033
  236. #define OSK_FILE_REGULAR        0000000
  237. #define OSK_DIRECTORY_PERM        0000200
  238. #define OSK_SHARED_PERM            0000100
  239. #define OSK_OTHER_EXEC_PERM        0000040
  240. #define OSK_OTHER_WRITE_PERM        0000020
  241. #define OSK_OTHER_READ_PERM        0000010
  242. #define OSK_OWNER_EXEC_PERM        0000004
  243. #define OSK_OWNER_WRITE_PERM        0000002
  244. #define OSK_OWNER_READ_PERM        0000001
  245.  
  246. #define UNIX_FILE_TYPEMASK        0170000
  247. #define UNIX_FILE_REGULAR        0100000
  248. #define UNIX_FILE_DIRECTORY        0040000
  249. #define UNIX_SETUID            0004000
  250. #define UNIX_SETGID            0002000
  251. #define UNIX_STYCKYBIT            0001000
  252. #define UNIX_OWNER_READ_PERM        0000400
  253. #define UNIX_OWNER_WRITE_PERM        0000200
  254. #define UNIX_OWNER_EXEC_PERM        0000100
  255. #define UNIX_GROUP_READ_PERM        0000040
  256. #define UNIX_GROUP_WRITE_PERM        0000020
  257. #define UNIX_GROUP_EXEC_PERM        0000010
  258. #define UNIX_OTHER_READ_PERM        0000004
  259. #define UNIX_OTHER_WRITE_PERM        0000002
  260. #define UNIX_OTHER_EXEC_PERM        0000001
  261. #define UNIX_RW_RW_RW            0000666
  262.  
  263. #define LZHEADER_STRAGE            4096
  264.  
  265. #ifdef S_IFLNK
  266. #define GETSTAT lstat
  267. #else
  268. #define GETSTAT stat
  269. #endif
  270.  
  271. /* used by qsort() for alphabetic-sort */
  272. #define STRING_COMPARE(a,b) strcmp((a),(b))
  273.  
  274. struct string_pool {
  275.   int used;
  276.   int size;
  277.   int n;
  278.   char *buffer;
  279. };
  280.  
  281.  
  282. /*----------------------------------------------------------------------*/
  283. /*                OPTIONS                    */
  284. /*----------------------------------------------------------------------*/
  285.  
  286. /* command line options (common options) */
  287. extern boolean    quiet;
  288. extern boolean    text_mode;
  289. extern boolean    verbose;
  290. extern boolean    noexec;        /* debugging option */
  291. extern boolean    force;
  292. extern boolean    prof;
  293. extern boolean    delete_after_append;
  294.  
  295. /* list command flags */
  296. extern boolean    verbose_listing;
  297.  
  298. /* extract/print command flags */
  299. extern boolean    output_to_stdout;
  300.  
  301. /* add/update/delete command flags */
  302. extern boolean    new_archive;
  303. extern boolean    update_if_newer;
  304. extern boolean    generic_format;
  305.  
  306.  
  307. /*----------------------------------------------------------------------*/
  308. /*                VARIABLES                */
  309. /*----------------------------------------------------------------------*/
  310.  
  311. extern char    **cmd_filev;
  312. extern int    cmd_filec;
  313.  
  314. extern char    *archive_name;
  315. extern char    expanded_archive_name[FILENAME_LENGTH];
  316. extern char    temporary_name[FILENAME_LENGTH];
  317. extern char    backup_archive_name[FILENAME_LENGTH];
  318.  
  319. extern char *reading_filename, *writting_filename;
  320. extern boolean    remove_temporary_at_error;
  321. extern boolean    recover_archive_when_interrupt;
  322. extern boolean    remove_extracting_file_when_interrupt;
  323.  
  324. extern int    archive_file_mode;
  325. extern int    archive_file_gid;
  326.  
  327. /*----------------------------------------------------------------------*/
  328. /*                Functions                */
  329. /*----------------------------------------------------------------------*/
  330.  
  331. extern void interrupt ();
  332.  
  333. extern void message ();
  334. extern void warning ();
  335. extern void error ();
  336. extern void fatal_error ();
  337.  
  338. extern boolean need_file ();
  339. extern int inquire ();
  340. extern FILE *xfopen ();
  341.  
  342. extern boolean find_files ();
  343. extern void free_files ();
  344.  
  345. extern void init_sp ();
  346. extern void add_sp ();
  347. extern void finish_sp ();
  348. extern void free_sp ();
  349. extern void cleaning_files ();
  350.  
  351. extern void build_temporary_name ();
  352. extern void build_backup_file_name ();
  353. extern void build_standard_archive_name ();
  354.  
  355. extern FILE *open_old_archive ();
  356. extern void init_header ();
  357. extern boolean get_header ();
  358. extern boolean archive_is_msdos_sfx1 ();
  359. extern boolean skip_msdos_sfx1_code ();
  360. extern void write_header ();
  361. extern void write_archive_tail ();
  362. extern void copy_old_one ();
  363. extern unsigned char *convdelim ();
  364. extern long copyfile ();
  365.  
  366. extern void cmd_list (), cmd_extract (), cmd_add (), cmd_delete ();
  367.  
  368. extern boolean ignore_directory;
  369. extern boolean compress_method;
  370. extern boolean verify_mode;
  371.  
  372. extern char *extract_directory;
  373. extern FILE *temporary_fp;
  374.